package uva.asimov.asimovtrainner;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

/**
 * 
 * @author Víctor Alonso Egido
 * @author Edgar Guaza Mayo
 * @author Rubén Moya Vázquez
 * 
 * Clase para manejar el acceso a base de datos
 */
public class DataBaseManager {

	//Definición de los nombres de las relaciones y campos
	public static final String TABLE_NAME = "entrenamientos";//Nombre de la tabla de la Base de datos
	public static final String CN_ID = "_id"; //Campo que se va a generar solo, autoincremental, ID								 
	public static final String CN_TIPO = "tipo"; //Campo tipo 
	public static final String CN_DESCRIPCION = "descripcion"; //Campo descripcion de la actividad deportiva realizada
	public static final String CN_FECHA = "fecha"; // Campo fecha 
	public static final String CN_DURACION = "duracion"; // Campo duración del entrenamiento
	public static final String CN_DISTANCIA = "distancia"; //Campo distancia del entrenamiento
	public static final String CN_VELOCIDAD = "velocidad"; //Campo velocidad del entrenamiento
	public static final String CN_OTROS = "otros"; //Otros detalles
	public static final String CN_UBICACION = "ubicacion"; //Campo ubicación del entrenamiento

	//String de creación de la tabla en la base de datos
	public static final String CREATE_TABLE = "create table " + TABLE_NAME + " (" 
	        + CN_ID + " integer primary key autoincrement," 
			+ CN_TIPO + " text not null," 
	        + CN_DESCRIPCION + " text," 
			+ CN_FECHA + " text," 
	        + CN_DURACION + " text," 
			+ CN_DISTANCIA + " text,"
			+ CN_VELOCIDAD + " text," 
			+ CN_OTROS + " text," 
			+ CN_UBICACION + " text);";
	
	private DBHelper helper;
	private SQLiteDatabase db;
	private Context context;
	
	private static final String ASIMOV=MainActivity.class.getSimpleName();

	/**
	 * Inicializa los objetos necesarios para manejar la base de datos
	 * 
	 * @param context contexto de la base de datos
	 */
	public DataBaseManager(Context context) {

		this.context=context;
		/* Para crear la base de datos */
		helper = new DBHelper(context);
		/* Nos devuelve la BD en modo escritura, el otro metodo es para lectura */
		db = helper.getWritableDatabase();

	}
	/**
	 * Función que borra la base de datos existente.
	 * Invocada desde menú de opciones
	 */
	public void dropDataBase(){
		this.context.deleteDatabase(helper.getDataBaseName());
	}

	/*
	 * Funcion que devuelve un Contenedor de valores Para no reutilizar codigo
	 */

	/**
	 * Genera los valores que serán cargados en la base de datos
	 * 
	 * @param tipo de deporte
	 * @param descripcion de la actividad
	 * @param fecha de realización
	 * @param duracion de la actividad
	 * @param distancia recorrida en la actividad
	 * @param velocidad media de realización de la actividad
	 * @param otros campos adicionales 
	 * @param ubicacion de la actividad
	 * @return valores generados con los datos introducidos
	 */
	private ContentValues generarContenValues(String tipo, String descripcion, String fecha, String duracion, String  distancia, String velocidad,String otros,String ubicacion) {

		ContentValues valores = new ContentValues();
		valores.put(CN_TIPO, tipo);
		valores.put(CN_DESCRIPCION, descripcion);
		valores.put(CN_FECHA, fecha);
		valores.put(CN_DURACION, duracion);
		valores.put(CN_DISTANCIA, distancia);
		valores.put(CN_VELOCIDAD, velocidad);
		valores.put(CN_OTROS, otros);
		valores.put(CN_UBICACION, ubicacion);

		return valores;
	}

	/**
	 * Inserta los valores en la base de datos
	 * 
	 * @param tipo de deporte
	 * @param descripcion de la actividad
	 * @param fecha de realización
	 * @param duracion de la actividad
	 * @param distancia recorrida en la actividad
	 * @param velocidad media de realización de la actividad
	 * @param otros campos adicionales 
	 * @param ubicacion de la actividad
	 * 
	 */
	public void insertar(String tipo, String descripcion, String fecha, String duracion, String  distancia, String velocidad,String otros,String ubicacion) {
		/*
		 * En el segundo poner un campo que pueda ser nulo, o poner NULL (poner
		 * siempre NULL)
		 */

		db.insert(TABLE_NAME, null, generarContenValues(tipo, descripcion, fecha, duracion,  distancia, velocidad,otros, ubicacion));
		/* Devuelve un long, si es -1 es que ha habido algun problema */
	}

	/* Insert con SQL */
	/*public void insertar2(String nombre, String telefono) {
		db.execSQL("insert into " + TABLE_NAME + " values (null,'" + nombre
				+ "'," + telefono + ")");
	}

	public void eliminar(String nombre) {
		db.delete(TABLE_NAME, CN_NAME + "=?", new String[] { nombre });
	}*/

	/* Eliminar varios de un paso */
	/*public void eliminarMultiple(String nombre1, String nombre2) {
		db.delete(TABLE_NAME, CN_NAME + "IN (?,?)", new String[] { nombre1,
				nombre2 });
	}
*/
	/* Modificar un registro de la BD */
	/*public void modificarTelefono(String nombre, String nuevoTelefono) {
		db.update(TABLE_NAME, generarContenValues(nombre, nuevoTelefono),
				CN_NAME + "=?", new String[] { nombre });
	}
*/
	/* Cargar todos los datos en un cursor */
	/**
	 * Cursor del registro actual
	 * 
	 * @return el registro actual
	 */
	public Cursor cargarCursor() {
		
		Log.d(ASIMOV, "En cursor cargar");
		//String[] columnas = new String[] { CN_ID, CN_TIPO, CN_DESCRIPCION, CN_FECHA, CN_DURACION, CN_DISTANCIA, CN_VELOCIDAD,CN_OTROS, CN_UBICACION};
		String[] columnas = new String[]{CN_ID, CN_DESCRIPCION, CN_FECHA};
		 
		/*
		 * En nuestro caso es una operacion simple, pero en BD grandes puede ser
		 * muy cosotosa, hacerla en segundo plano
		 */
		return db.query(TABLE_NAME, columnas, null, null, null, null, null);
	}
	
	//public String getNombre ()

	/**
	 * Carga los datos completos de uno de los registros
	 * 
	 * @param clave clave del registro
	 * @return Cursor con el resultado de la consulta
	 */
	public Cursor buscarEntrenamiento(String clave) {
		Log.d(ASIMOV,"En CURSOR  1"+"******************");
		String[] columnas = new String[]  {CN_ID, CN_TIPO, CN_DESCRIPCION, CN_FECHA, CN_DURACION, CN_DISTANCIA, CN_VELOCIDAD,CN_OTROS, CN_UBICACION};
		// db.query(table, columns, selection, selectionArgs, groupBy, having,
		// orderBy)
		// nombre se sustituye por la interrogacion de la seleccion

		Log.d(ASIMOV,"En CURSOR  2"+"******************");
		//String p = Integer.toString(pos);
		Log.d(ASIMOV,"En CURSOR  3"+"******************");
		return db.query(TABLE_NAME, columnas, CN_ID + "=?", new String[] { clave }, null, null, null);
		//return db.execSQL("SELECT FROM"+);
		
	}

}